namespace Admin.Domain.Entities;

public class Permission : EntityBase
{
    public Permission()
    {

    }
    /// <summary>
    /// 权限名称
    /// </summary>
    public string PermissionName { get; set; } = null!;

    /// <summary>
    /// 关联的角色集合
    /// </summary>
    public virtual ICollection<Role> Roles { get; set; } = new HashSet<Role>();

    /// <summary>
    /// 私有的构造函数
    /// </summary>
    private Permission(string permissionName)
    {
        PermissionName = permissionName;
    }

    /// <summary>
    /// 注册新权限
    /// </summary>
    /// <param name="permissionName">权限名</param>
    /// <returns>权限对象 或 null</returns>
    public static Permission? CreatePermission(string permissionName)
    {
        if (!ValidatePermissionName(permissionName))
        {
            return null;
        }

        return new Permission(permissionName);
    }

    /// <summary>
    /// 软删除权限
    /// </summary>
    /// <returns>是否删除成功</returns>
    public bool DeletePermission()
    {
        if (IsDeleted)
        {
            return false;
        }
        IsDeleted = true;
        return true;
    }

    /// <summary>
    /// 更新权限信息
    /// </summary>
    /// <param name="newPermissionName">新的权限名</param>
    /// <param name="newDescription">新的简介</param>
    /// <returns>是否修改成功</returns>
    public bool UpdatPermissionInfo(string newPermissionName, string? newDescription)
    {
        // 验证新的权限名是否有效
        if (!ValidatePermissionName(newPermissionName))
        {
            return false;
        }

        // 检查权限是否已经被软删除
        if (IsDeleted)
        {
            return false;
        }

        // 更新权限名
        PermissionName = newPermissionName;
        Description = newDescription;
        // 返回更新成功
        return true;
    }

    /// <summary>
    /// 添加被赋予权限的角色
    /// </summary>
    /// <param name="role">被赋予权限的角色</param>
    /// <returns>是否添加成功</returns>
    public bool AddRole(Role role)
    {
        // 检查权限是否已经被软删除
        if (IsDeleted)
        {
            return false;
        }

        Roles.Add(role);
        return true;
    }

    /// <summary>
    /// 移除被赋予权限的角色
    /// </summary>
    /// <param name="user">被移除权限的角色</param>
    /// <returns>是否移除成功</returns>
    public bool RemoveRole(Role role)
    {
        // 检查权限是否已经被软删除
        if (IsDeleted)
        {
            return false;
        }

        Roles.Remove(role);
        return true;
    }

    /// <summary>
    /// 启用权限
    /// </summary>
    /// <returns>是否启用成功</returns>
    public bool EnablePermission()
    {
        // 检查权限是否已经被软删除
        if (IsDeleted)
        {
            return false;
        }

        // 检查权限是否已经被启用
        if (IsActive)
        {
            return false;
        }

        IsActive = true;

        // 返回成功
        return true;
    }

    /// <summary>
    /// 禁用权限
    /// </summary>
    /// <returns>是否权限成功</returns>
    public bool DisablePermission()
    {
        // 检查权限是否已经被软删除
        if (IsDeleted)
        {
            return false;
        }

        // 检查权限是否已经被禁用
        if (!IsActive)
        {
            return false;
        }

        IsActive = false;

        // 返回成功
        return true;
    }

    /// <summary>
    /// 验证角色名
    /// </summary>
    /// <param name="permissionName">角色名</param>
    private static bool ValidatePermissionName(string permissionName)
    {
        // 验证权限名是否为空
        if (string.IsNullOrWhiteSpace(permissionName))
        {
            return false;
        }

        // 可以添加其他验证

        return true;
    }
}